"""
UI组件模块
负责用户界面相关的组件和交互功能
"""

import pandas as pd
import streamlit as st
from src.config import TOP_FEATURES_COUNT


def create_sidebar():
    """创建侧边栏"""
    st.sidebar.header("🤖 选择预测模型")
    
    model_choice = st.sidebar.selectbox(
        "选择预测模型",
        ["随机森林", "SVM", "弹性网络"],
        help="随机森林：适合处理非线性关系，可解释性强\nSVM：适合高维数据，泛化能力强\n弹性网络：结合L1和L2正则化，适合特征选择"
    )
    
    # 添加重新训练模型的选项
    if st.sidebar.checkbox("🔄 重新训练模型", help="勾选此项将重新训练所有模型（需要几分钟时间）"):
        if st.sidebar.button("🚀 开始重新训练"):
            st.info("🔄 正在重新训练模型，请稍候...")
            # 清除缓存并重新训练
            from src.models import get_model_manager
            get_model_manager.clear()
            # 删除已保存的模型文件
            from src.config import MODELS_DIR
            if MODELS_DIR.exists():
                for file in MODELS_DIR.glob("*.pkl"):
                    file.unlink()
            st.success("✅ 模型重新训练完成！")
            st.rerun()
    
    st.sidebar.header("📋 输入房屋特征")
    
    return model_choice


def create_input_form():
    """创建用户输入表单"""
    inputs = {}
    
    # 主要特征输入
    inputs['OverallQual'] = st.sidebar.slider("整体质量评分 (1-10)", 1, 10, 5)
    inputs['GrLivArea'] = st.sidebar.slider("居住面积 (平方英尺)", 500, 5000, 1500)
    inputs['TotalBsmtSF'] = st.sidebar.slider("地下室总面积 (平方英尺)", 0, 5000, 1000)
    inputs['2ndFlrSF'] = st.sidebar.slider("二楼面积 (平方英尺)", 0, 3000, 500)
    inputs['BsmtFinSF1'] = st.sidebar.slider("地下室装修面积 (平方英尺)", 0, 3000, 500)
    
    return pd.DataFrame([inputs])


def display_prediction_result(prediction, model_choice, model_performance):
    """显示预测结果"""
    st.success(f"**预测房价：${prediction:,.2f}**")
    st.info(f"💡 使用模型：{model_choice}")
    
    # 显示模型性能
    if model_performance:
        st.metric("模型R²分数", f"{model_performance['r2']:.4f}")
        st.metric("均方误差", f"{model_performance['mse']:.2f}")
        st.metric("RMSE", f"{model_performance['rmse']:.2f}")


def create_feature_exploration_section(data, top_features):
    """创建特征探索部分"""
    st.subheader("🔍 数据分布探索")
    
    # 特征选择
    explore_feature = st.selectbox(
        "选择要探索的特征",
        options=top_features,
        index=0
    )
    
    return explore_feature


def create_model_comparison_section():
    """创建模型比较部分"""
    st.subheader("📊 模型性能比较")
    
    show_comparison = st.checkbox("显示模型比较")
    
    return show_comparison


def create_data_display_section():
    """创建数据显示部分"""
    show_full_data = st.checkbox("显示完整数据集")
    
    return show_full_data


def display_model_info(feature_names, sample_count, top_features):
    """显示模型信息"""
    st.subheader("⚙️ 模型信息")
    st.markdown(f"**可用模型**: 随机森林, SVM, 弹性网络")
    st.markdown(f"**使用特征数**: {len(feature_names)}")
    st.markdown(f"**训练样本数**: {sample_count}")
    st.markdown(f"**特征重要性前五**: {', '.join(top_features)}")
    st.markdown(f"**参数调优**: 使用GridSearchCV进行5折交叉验证")


def create_header():
    """创建页面头部"""
    st.title("🏠 房屋价格预测系统")
    st.markdown("基于机器学习模型预测房屋市场价格，支持随机森林、SVM和弹性网络三种算法")
    
    # 显示模型状态
    from src.config import MODELS_DIR
    if MODELS_DIR.exists() and any(MODELS_DIR.glob("*.pkl")):
        st.success("✅ 使用已保存的模型（快速加载）")
    else:
        st.info("🔄 首次运行，正在训练模型...")


def create_footer():
    """创建页面底部"""
    st.markdown("---")
    st.caption("基于特征重要性分析的房价预测系统")


def display_user_input(input_df):
    """显示用户输入的特征"""
    st.subheader("📋 用户输入的特征")
    st.dataframe(input_df)


def create_prediction_button():
    """创建预测按钮"""
    return st.button("🚀 预测房价")


def get_model_mapping():
    """获取模型名称映射"""
    return {
        "随机森林": "rf",
        "SVM": "svm", 
        "弹性网络": "elastic"
    }
